package org.hibernate.dao;

import java.util.List;

@SuppressWarnings("unchecked")
public interface IBaseDao {
	/**
	 * 统计类对象所有数量;
	 */
	public int countAll(String clazz);

	/**
	 * 通过HQL语句统计数量;
	 */
	public int countQuery(String hql);

	/**
	 * 统计SQL语句统计数量;
	 * 
	 * @param sql
	 * @return
	 */
	public int countSqlQuery(String sql);

	/**
	 * 
	 * 分页查询类对象的数据;
	 * 
	 * @param clazz
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */

	public List listAll(String clazz, int pageNo, int pageSize);

	/**
	 * 先清除缓存再获取指定主键编号的对象;
	 * 
	 * @param clazz
	 * @param id
	 * @return
	 */
	public Object loadById(Class<?> clazz, int id);

	/**
	 * 通过HQL条件查询一个对象;
	 * 
	 * @param hql
	 * @return
	 */
	public Object loadByHql(String hql);

	/**
	 * 通过HQL语句分页查询数据;
	 * 
	 * @param hql
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public List query(String hql, int pageNo, int pageSize);

	/**
	 * 通过HQL语句查询数据;
	 * 
	 * @param hql
	 * @return
	 */
	public List query(String hql);

	/**
	 * 通过HQL语句查询数据，可使用SPRING的缓存功能;
	 * 
	 * @param hql
	 * @param cache
	 * @return
	 */
	public List query(String hql, boolean cache);

	/**
	 * 添加更新对象;
	 * 
	 * @param obj
	 */
	public void saveOrUpdate(Object obj);

	/**
	 * 通过HQL语句更新对象;
	 * 
	 * @param hql
	 * @return
	 */
	public int update(String hql);

	/**
	 * 通过SQL语句分页查询数据;
	 * 
	 * @param cla
	 * @param sql
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public List getPageBySql(Class cla, String sql, int pageNo, int pageSize);

	/**
	 * 通过SQL语句查询数据;
	 * 
	 * @param entity
	 * @param sql
	 * @return
	 */
	public List getObjectBySQL(Class entity, String sql);

	/**
	 * 通过SQL语句删除对象;
	 * 
	 * @param entity
	 * @param sql
	 * @return
	 */
	public boolean delObjectBySQL(Class entity, String sql);

	/**
	 * 通过主键编号查询数据的对象，非缓存对象;
	 * 
	 * @param clazz
	 * @param id
	 * @return
	 */
	public Object loadObjClearSessionFirst(Class<?> clazz, int id);

	/**
	 * 通过主键编号查询数据对象，先查缓存，后查数据库;
	 * 
	 * @param clazz
	 * @param id
	 * @return
	 */
	public Object load(Class<?> clazz, int id);

	/**
	 * 添加对象;
	 * 
	 * @param obj
	 * @return
	 */
	public Object save(Object obj);

	/**
	 * 更新对象;
	 * 
	 * @param obj
	 * @return
	 */
	public Object updateObject(Object obj);

	/**
	 * 保存一组对象;
	 * 
	 * @param list
	 * @return
	 */
	public boolean saveList(List<?> list);

	/**
	 * 删除对象;
	 * 
	 * @param obj
	 * @return
	 */
	public boolean deleteObj(Object obj);

	/**
	 * 更新一组数据;
	 * 
	 * @param list
	 * @return
	 */
	public boolean updateByHqlList(List<String> list);

	/**
	 * 通过HQL语句查询头几条数据;
	 * 
	 * @param hql
	 * @param size
	 * @return
	 */
	public List<?> getTopList(String hql, int size);

}